{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "'''\n",
    "selu激活函数\n",
    "添加AlphaDropout层次，model.add(keras.layers.AlphaDropout(rate=0.5))，减少模型过拟合现象\n",
    "\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 28, 28) (5000,)\n",
      "(55000, 28, 28) (55000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()\n",
    "x_valid, x_train = x_train_all[:5000], x_train_all[5000:]\n",
    "y_valid, y_train = y_train_all[:5000], y_train_all[5000:]\n",
    "\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# x = (x - u) / std\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "# x_train: [None, 28, 28] -> [None, 1]\n",
    "x_train_scaled = scaler.fit_transform(\n",
    "    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n",
    "x_valid_scaled = scaler.transform(\n",
    "    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n",
    "x_test_scaled = scaler.transform(\n",
    "    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tf.keras.models.Sequential()\n",
    "\n",
    "\n",
    "model = keras.models.Sequential()\n",
    "## 将数据变为786个feature，这一层的作用是将将输入的数据[batch_size,28,28] => [batch_size,28^2]，feature的数量是 28^2\n",
    "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "for _ in range(20):\n",
    "    ## 激活函数选择 selu，训练效果更加好一些\n",
    "    model.add(keras.layers.Dense(100, activation=\"selu\"))\n",
    "    \n",
    "    \n",
    "## 在模型隐藏层最后一层，添加AlphaDropout，去除掉一部分的神经元，减少模型过拟合现象\n",
    "## rate 表示使多少比例的神经元失效\n",
    "model.add(keras.layers.AlphaDropout(rate=0.5))\n",
    "# AlphaDropout: 1. 均值和方差不变 2. 归一化性质也不变\n",
    "# model.add(keras.layers.Dropout(rate=0.5))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))\n",
    "\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer = \"sgd\",\n",
    "              metrics = [\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "flatten (Flatten)            (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 100)               78500     \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_6 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_7 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_8 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_9 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_10 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_11 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_12 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_13 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_15 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_16 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_17 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_18 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_19 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "alpha_dropout (AlphaDropout) (None, 100)               0         \n",
      "_________________________________________________________________\n",
      "dense_20 (Dense)             (None, 10)                1010      \n",
      "=================================================================\n",
      "Total params: 271,410\n",
      "Trainable params: 271,410\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 17s 318us/sample - loss: 1.2276 - accuracy: 0.5770 - val_loss: 0.7827 - val_accuracy: 0.7920\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 16s 293us/sample - loss: 0.7294 - accuracy: 0.7639 - val_loss: 0.7274 - val_accuracy: 0.8336\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 15s 274us/sample - loss: 0.6002 - accuracy: 0.8067 - val_loss: 0.7089 - val_accuracy: 0.8452\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 15s 274us/sample - loss: 0.5331 - accuracy: 0.8278 - val_loss: 0.6283 - val_accuracy: 0.8530\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 15s 278us/sample - loss: 0.4917 - accuracy: 0.8402 - val_loss: 0.6323 - val_accuracy: 0.8550\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 15s 275us/sample - loss: 0.4648 - accuracy: 0.8471 - val_loss: 0.5987 - val_accuracy: 0.8658\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 15s 265us/sample - loss: 0.4378 - accuracy: 0.8531 - val_loss: 0.5850 - val_accuracy: 0.8652\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 14s 254us/sample - loss: 0.4190 - accuracy: 0.8612 - val_loss: 0.5770 - val_accuracy: 0.8694\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 14s 258us/sample - loss: 0.4027 - accuracy: 0.8647 - val_loss: 0.5607 - val_accuracy: 0.8696\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 15s 269us/sample - loss: 0.3881 - accuracy: 0.8695 - val_loss: 0.5772 - val_accuracy: 0.8726\n"
     ]
    }
   ],
   "source": [
    "# Tensorboard, earlystopping, ModelCheckpoint\n",
    "logdir = './dnn-selu-dropout-callbacks'\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,\n",
    "                                 \"fashion_mnist_model.h5\")\n",
    "\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(logdir),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,\n",
    "                                    save_best_only = True),\n",
    "    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),\n",
    "]\n",
    "history = model.fit(x_train_scaled, y_train, epochs=10,\n",
    "                    validation_data=(x_valid_scaled, y_valid),\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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/sD3v/99brjhBlpaWvD5fKxYsYKMjAzeeOMNwHg4hhBCiIElYsP5eD3c02XSpP+/vfsPrqpO7zj+fiC3BLHlV2qCsBWcFYJwRRYGayniJKW4FmHHMWZROkynukW3iQuOlSKjVIFpFav+4TDjxBWCQcS4jAzjbK2ToM2olMBSfm4zNlUIAokxZklbCeDTP+4hAyGEe29Czr2Xz2smwznnnnPP8+TOzcP5nu/5fifT2NjIV199RVNTE0OHDiUvL4/Fixfz8ccf069fP44ePcqJEyfIy8uL+31ramooKSkBID8/nxtuuIG6ujpuv/12Vq1aRUNDA/feey833XQT0WiUxx9/nCeffJI5c+YwY8aMK5WuiIikKN1z7qSoqIjKykrefvttiouLqaiooKmpiV27drFnzx5yc3MvmqM5WQ888ABbt25l4MCB3H333VRVVTF27Fh2795NNBpl+fLlPPvss71yLhERSR8pe+UcluLiYh5++GG+/vprPvroIzZv3sx1111HJBKhurqaL7/8MuH3nDFjBhUVFRQUFFBXV8fhw4cZN24c9fX13HjjjZSWlnL48GH27t1Lfn4+w4YNY8GCBQwZMoSysrIrkKWIiKQyFedOJkyYwMmTJxk5ciQjRozgwQcf5J577iEajTJ16lTy8/MTfs9HH32URx55hGg0SlZWFuvWrWPAgAFs3ryZDRs2EIlEyMvLY9myZezcuZMnnniCfv36EYlEWLt27RXIUkREUpmKcxf27dvXsZyTk8Onn37a5X5tbW2cPHmyy9dGjx7N/v37AcjOzuaNN964aJ+lS5eydOnSC7bNnj2b2bNnJxu6iIhkAN1zFhERSTG6cu6hAwcOsGjRogu2DRgwgB07doQUkYiIpDsV5x6aMGECe/bsCTsMERHJIGrWFhERSTEqziIiIilGxVlERCTFqDiLiIikGBXnHuhuPmcREZFkqThngDNnzoQdgoiI9KKUfZTq+OrVnDrUu/M5DxifT96yZZd8vTfnc25ra2PevHldHldeXs6aNWswM2655RY2bNjAiRMnWLRoEfX19QCsXbuW66+/njlz5nSMNLZmzRra2tpYsWIFd955J7feeis1NTXMnz+fsWPHsnLlStrb2xk+fDgVFRXk5ubS1tZGSUkJtbW1mBnPPPMMra2t7N27l5dffhmAdevWUV9fz0svvdSj36+I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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(history)\n",
    "\n",
    "# 1. 参数众多，训练不充分\n",
    "# 2. 梯度消失 -> 链式法则 -> 复合函数f(g(x))\n",
    "#    selu缓解梯度消失"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 2s 159us/sample - loss: 0.6630 - accuracy: 0.8531\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.6629706964790821, 0.8531]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
